/*
 * 版权所有 ( c ) 联想集团有限公司 2005-2009 保留所有权利。
 * 项目：	Lenovo Push Service
 * 文件名：	XmlUtil.java
 * 版本:    1.0
 * 描述：	
 * 作者：	刘兵召
 * 日期：	Jun 8, 2010 
 * 修改历史：
 * 【时间】		【修改者】	【修改内容】
 */
package com.feng.util.xml;

import java.io.CharArrayReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Map;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import com.feng.util.FileUtil;
/**
 * 通过SAX 解析xml方式由xml生成java的Map对象（同理可以生成自定义的java POJO对象）  
 * @author Administrator
 *
 */
public class XmlUtil {
	
	/**
	 * 由xml转换为Map对象 
	 * @param xmlText xml信息
	 * @param handler saxHander
	 * @return xml转换的map对象
	 */
	public static Map<String, String> Parse(String xmlText,MapSAXHandler handler) {
		if (xmlText == null || xmlText.trim().length() == 0) {
			System.out.println("Parse() text is null !");
			return null;
		}
		Map<String, String> data = null;
		try {
			System.out.println("Xml Parsing :\n" + xmlText);
			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser sp = spf.newSAXParser();
			XMLReader xr = sp.getXMLReader();
			xr.setContentHandler(handler);
			CharArrayReader car = new CharArrayReader(xmlText.toCharArray());
			xr.parse(new InputSource(car));
			data = handler.getParseData();
			printMap(data);
			car.close();
		} catch (Throwable e) {
			System.out.println("ParsingXMLError:\n");
			return null;
		}
		return data;
	}
	
	/**
	 * 由xml转换为Map对象
	 * @param r xml信息的Reader对象
	 * @param handler saxHander
	 * @return xml转换的map对象
	 */
	private static Map<String, String> Parse(Reader r, MapSAXHandler handler) {
		Map<String, String> data = null;
		try {
			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser sp = spf.newSAXParser();
			XMLReader xr = sp.getXMLReader();
			xr.setContentHandler(handler);
			xr.parse(new InputSource(r));
			data = handler.getParseData();
			r.close();
		} catch (Throwable e) {
			System.out.println("ParsingXMLError");
		}
		return data;
	}
	
	/**
	 * 由xml转换为Map对象
	 * @param is xml信息的InputStream对象
	 * @param handler saxHander
	 * @return xml转换的map对象
	 */
	public static Map<String, String> Parse(InputStream is,MapSAXHandler handler) {
		InputStreamReader isr = new InputStreamReader(is);
		return Parse(isr, handler);
	}

	private static void printMap(Map<String, String> map){
		if (map == null) {
			System.out.println("map is NULL");
			return;
		}
		for (Map.Entry<String, String> entry : map.entrySet()) {
			Object key = entry.getKey();
			Object value = entry.getValue();
			System.out.println(String.format("key(%s) value(%s)", key, value));
		}
	}

	public static void main(String[] args) throws IOException {
		String xml = FileUtil.readFile2String("E:/code/MyTest/src/com/feng/util/xml/error.xml");
		MapSAXHandler hander = new MapSAXHandler();
		Parse(xml, hander);
	}
}
